package com.yl.map;

import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 描述: Jdk1.7 中的 `HashMap` 在扩容时新哈希表数组和旧哈希表数组之间存在相互引用关系
 * ，因此在并发情况下会出现死循环的问题。
 * 在 jdk1.8 中是否还存在同样的问题？
 * 下面我们通过一个例子进行验证一下。
 *
 * @author: yanglin
 * @Date: 2020-11-16-14:12
 * @Version: 1.0
 */
@Slf4j
public class HashMapTest {
    /**
     * NUMBER = 50，表示 50 个线程分别执行 put 方法 50 次
     * 线程安全的情况下因该 map size 应该为 2500
     */
    public static final int NUMBER = 50;

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < NUMBER; i++) {
            new Thread(new HashMapTask(map)).start();
        }
        log.info("扩容时新哈希表数组和旧哈希表数组之间存在相互引用关系 map size = " + map.size());
    }

    static class HashMapTask implements Runnable {

        Map<String, String> map;

        public HashMapTask(Map<String, String> map) {
            this.map = map;
        }

        @Override
        public void run() {
            for (int i = 0; i < HashMapTest.NUMBER; i++) {
                map.put(i + "-" + Thread.currentThread().getName(), "put");
            }
        }
    }
}
